#include "cabeceras.h"

#define LARGO_MAX_PALABRA 100

// Lee foo.dat con las instrucciones y las almacena en un arreglo de cadenas, línea por línea.
void lee(char ***strs, int *lineas, const char *filename)
{
	FILE *fp = NULL;
	int i = 0;
	int j = 1;
	
	fp = fopen(filename, "r");
	if (fp == NULL)
	return;
	
	*strs = calloc(j, sizeof(char**));
	(*strs)[i] = calloc(LARGO_MAX_PALABRA, sizeof(char));
	
	while (fgets((*strs)[i], LARGO_MAX_PALABRA, fp)) {
		i++;
		j++;
		(*lineas)++;
		*strs = realloc(*strs, j*sizeof(char**));
		(*strs)[i] = calloc(LARGO_MAX_PALABRA, sizeof(char));
	}
	
	fclose(fp);
}

void reemplazar_caracter(char *str, int tam, char c, char r)
{
	int i;

	for (i = 0; i < tam; i++) {
		if (str[i] == c)
			str[i] = r;
	}
}

/*
   Libera la memoria de los arrelglos de cadenas
*/
void liberar_memoria(char **strs, int lineas)
{
	int i;

	for (i = 0; i < lineas; i++)
		free(strs[i]);
	free(strs);
}

/*
   Computa una posición a partir de la llave, max_tam lo usamos para ajustar el rango de
   valores para el índice. 
   Devuelve posición.
*/
unsigned int HT(int key, unsigned int max_tam) 
{
	key *= key;

	return key % max_tam;
}

/*
pos: posición en el array
p[]: array
tam: tamaño del array
item: item a insertar

Retorno: 0 éxito, 1 fallo
*/
int hashinsert_P(unsigned int pos, struct tProducto p[] , unsigned int tam,\
		struct tProducto item)
{
	int i;

	for (i = pos; i < tam; i++) {
		// -1 == slot vacío
		if (p[i].id == -1) {
			p[i] = item;
			return 0;
		}
	}

	for (i = 0; i <pos; i++) {
		// -1 == slot vacío
		if (p[i].id == -1) {
			p[i] = item;
			return 0;
		}
	}

	return 1;
}

int hashinsert_O(unsigned int pos, struct tOferta o[], unsigned int tam, struct tOferta item)
{
	int i;

	for (i = pos; i < tam; i++) {
		// -1 == slot vacío
		if (o[i].id == -1) {
			o[i] = item;
			return 0;
		}
	}

	for (i = 0; i <pos; i++) {
		// -1 == slot vacío
		if (o[i].id == -1) {
			o[i] = item;
			return 0;
		}
	}

	return 1;
}


/*
   Busca un dato en el arreglo.
pos: posición en el arreglo.
p: arreglo
tam: tamaño del arreglo
id: codigo del producto
*/
struct tProducto hashsearch_P(unsigned int pos, struct tProducto p[], unsigned int tam,\
		unsigned int id)
{
	int i;
	struct tProducto p_err = {-1, "no existe", 0};

	for (i = pos; i < tam; i++) {
		if (p[i].id == id) {
			return p[i];
		}
	}

	for (i = 0; i <pos; i++) {
		if (p[i].id == id) {
			return p[i];
		}
	}

	return p_err;
}

struct tOferta hashsearch_O(unsigned int pos, struct tOferta o[], \
		unsigned int tam, unsigned int id)
{
	int i;
	struct tOferta o_err = {-1, 0, 0};

	for (i = pos; i < tam; i++) {
		if (o[i].id == id) {
			return o[i];
		}
	}

	for (i = 0; i <pos; i++) {
		if (o[i].id == id) {
			return o[i];
		}
	}

	return o_err;
}
